package com.xingkeduo.util.tool;

import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ArrayNode;
import com.fasterxml.jackson.databind.node.ObjectNode;

/**
 * 
 * @author GJ
 * @time 2018年12月12日 下午6:36:39
 * @description
 */
public class ReturnUtil {
	public enum Status {
		SUCCESS(1), FAIL(0);

		private int index;

		public static Status getStatus(String value) {
			int value_int = Integer.parseInt(value);
			return getStatus(value_int);
		}

		public static Status getStatus(int value) {
			Status[] statuses = Status.values();
			for (int i = 0; i < statuses.length; i++) {
				if (statuses[i].getIndex() == value)
					return statuses[i];
			}
			return null;
		}

		private Status(int index) {
			this.index = index;
		}

		public int getIndex() {
			return this.index;
		}
	}

	private static ObjectMapper mapper = new ObjectMapper();
	private ObjectNode root;
	private ObjectNode error;

	private static final String STATUS = "status";
	private static final String ERRORCODE = "code";
	private static final String ERRORMSG = "msg";
	private static final String DATA = "data";

	public ReturnUtil() {
		root = mapper.createObjectNode();
		error = mapper.createObjectNode();
	}

	/**
	 * 得到成功的json返回值
	 * 
	 * @author GJ
	 * @time 2018年12月13日 下午6:22:51
	 * @return
	 */
	public String getSuccess() {
		root.put(STATUS, Status.SUCCESS.getIndex());
		root.putPOJO(DATA, mapper.createObjectNode());
		return root.toString();
	}

	/**
	 * 得到成功的json返回值
	 * 
	 * @author GJ
	 * @time 2018年12月13日 下午6:22:57
	 * @param arrayContent
	 * @return
	 */
	public String getSuccess(ArrayNode arrayContent) {
		root.put(STATUS, Status.SUCCESS.getIndex());
		root.putPOJO(DATA, arrayContent);
		return root.toString();
	}

	/**
	 * 得到成功的json返回值
	 * 
	 * @author GJ
	 * @time 2018年12月13日 下午6:23:05
	 * @param objectContent
	 * @return
	 */
	public String getSuccess(ObjectNode objectContent) {
		root.put(STATUS, Status.SUCCESS.getIndex());
		root.putPOJO(DATA, objectContent);
		return root.toString();
	}

	/**
	 * 得到成功的json返回值
	 * 
	 * @author GJ
	 * @time 2018年12月13日 下午6:23:05
	 * @param objectContent
	 * @return
	 */
	public String appandSuccess(String key, ObjectNode objectContent) {
		root.put(STATUS, Status.SUCCESS.getIndex());

		if (!root.has(DATA))
			getSuccess(objectContent);
		else
			root.putPOJO(key, objectContent);
		return root.toString();
	}

	/**
	 * 得到异常的json返回值
	 * 
	 * @author GJ
	 * @time 2018年12月13日 下午6:23:11
	 * @param code
	 * @param message
	 * @return
	 */
	public String getException(String code, String message) {
		root.put(STATUS, Status.FAIL.getIndex());
		if (!CommonUtil.isEmpty(code))
			root.put(ERRORCODE, code);
		root.put(ERRORMSG, message);
		return root.toString();
	}

	/**
	 * 分析返回信息
	 * 
	 * @author GJ
	 * @time 2018年12月13日 下午6:24:13
	 * @param json
	 * @return
	 */
	public static String analyzeJson(String json) throws Throwable {
		if (json.isEmpty())
			return null;
		JsonNode root = mapper.readTree(json);
		if (!root.isObject())
			throw new Throwable("返回值不是json格式");

		if (!root.has("status"))
			throw new Throwable("status不存在");
		JsonNode statusNode = root.get("status");

		Status status = Status.getStatus(statusNode.path("status").asText());
		if (status == null)
			throw new Throwable("status非法：" + statusNode.path("status").asText());

		if (Status.SUCCESS == status) {
			if (!root.has("data"))
				return null;
			return root.get("data").asText();
		} else {
			if (!root.has("code"))
				return null;
			throw new Throwable(root.path("code").asText());
		}
	}

	/**
	 * 分析返回信息
	 * 
	 * @author GJ
	 * @time 2018年12月13日 下午6:24:13
	 * @param json
	 * @return
	 */
	public static JsonNode analyze(String json) throws Throwable {
		if (json.isEmpty())
			return null;
		JsonNode root = mapper.readTree(json);
		if (!root.isObject())
			throw new Throwable("返回值不是json格式");

		if (!root.has("status"))
			throw new Throwable("status不存在");
		JsonNode statusNode = root.path("status");

		Status status = Status.getStatus(statusNode.asText());
		if (status == null)
			throw new Throwable("status非法：" + statusNode.asText());

		if (Status.SUCCESS == status) {
			if (!root.has("data"))
				return null;
			return root;
		} else {
			if (!root.has("msg"))
				return null;
			throw new Throwable(root.path("msg").asText());
		}
	}
}
